package br.com.controle.ejb;

import br.com.controle.entity.Pedido;
import br.com.controle.entity.Pessoa;
import br.com.controle.entity.Produto;
import br.com.controle.mdb.Mensagem;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
 
@Stateless
@LocalBean
public class PedidoSessionBean {
    @Resource(mappedName = "jms/NotificationQueue")
    private Queue notificationQueue;
    @Resource(mappedName = "jms/NotificationQueueFactory")
    private ConnectionFactory notificationQueueFactory;

    @PersistenceContext
    private EntityManager em;    

    public List<Pedido> retrieve() {
        Query query = em.createNamedQuery("Pedido.findAll");
        return query.getResultList();
    }
        
    public List<Pessoa> getPessoa(){
        Query query = em.createNamedQuery("Pessoa.findAll");
        return query.getResultList();
    }   
    public List<Produto> getProduto(){
        Query query = em.createNamedQuery("Produto.findAll");
        return query.getResultList();
    }
    
    public List<Pedido> getMaisVendidos(){
        List dados = new ArrayList();
        Query query = em.createQuery("SELECT  p, sum(p.quantidade)  FROM Pedido p  group by  p.idProduto");

        List<Object[]> results = query.getResultList();
        
        for (Object[] result : results) {

            Pedido pedido = new Pedido();          
            
            Produto produto = new Produto();
            produto.setNome(((Pedido)result[0]).getIdProduto().getNome());
            
            pedido.setIdProduto(produto);
            pedido.setQuantidade(Integer.parseInt(String.valueOf(result[1])));

            dados.add(pedido);
        }
        return dados;
    }    
    
    public List<Pedido> getClientesMaisCompram(){
        List dados = new ArrayList();
        Query query = em.createQuery("Select p, sum(p.valorTotal) from Pedido p group by p.idPessoa");        

        List<Object[]> results = query.getResultList();
        
        for (Object[] result : results) {

            Pedido pedido = new Pedido();          
            
            Pessoa pessoa = new Pessoa();
            pessoa.setNome(((Pedido)result[0]).getIdPessoa().getNome());
            
            pedido.setIdPessoa(pessoa);
            pedido.setValorTotal(Float.parseFloat(String.valueOf(result[1])));

            dados.add(pedido);
        }
        return dados;
    }
    
    public Pedido create(Pedido pedido)
    {
        em.merge(pedido); 
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(pedido);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return pedido;
    }    

    public Pedido update(Pedido pedido)
    {           
        Pedido updated = em.merge(pedido); 
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(updated);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return updated;
    }
    
    public void delete(Pedido pedido) {
        Pedido excluir = em.find(Pedido.class, pedido.getId());
        em.remove(excluir);
        Mensagem m = new Mensagem();
        try {
            m.sendJMSMessageToNotificationQueue(excluir);
        } catch (JMSException ex) {
            Logger.getLogger(MedidaSessionBean.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }      
    
    public Pedido getPedido(Pedido pedido){
        Query query = em.createNamedQuery("Pedido.findById").setParameter("id", pedido.getId());
        return (Pedido) query.getSingleResult();
    }
}
